package 力扣;
//在一条环路上有 N 个加油站，其中第 i 个加油站有汽油 gas[i] 升。
//
//你有一辆油箱容量无限的的汽车，从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发，开始时油箱为空。
//
//如果你可以绕环路行驶一周，则返回出发时加油站的编号，否则返回 -1。
public class 加油站 {
    public static void main(String[] args) {
         int[] gas={1,2,3,4,5};
         int[] cost={3,4,5,1,2};
        int i = canCompleteCircuit(gas, cost);
        System.out.println(i);

    }
    public static int canCompleteCircuit(int[] gas, int[] cost) {
           int n=gas.length;
        for (int i = 0; i < n; i++) {
            int j=i;
            int remain=gas[j];
            while(remain-cost[j]>=0){
                remain=remain-cost[j]+cost[(j+1)%n];
                j=(j+1)%n;
                if (j==i)
                    return i;
            }
//            当考虑 i 能到达的最远的时候，假设是 j。
//
//那么 i + 1 到 j 之间的节点是不是就都不可能绕一圈了？
//
//假设 i + 1 的节点能绕一圈，那么就意味着从 i + 1 开始一定能到达 j + 1。
//
//又因为从 i 能到达 i + 1，所以从 i 也能到达 j + 1。
//
//但事实上，i 最远到达 j 。产生矛盾，所以 i + 1 的节点一定不能绕一圈。同理，其他的也是一样的证明。
//
//所以下一次的 i 我们不需要从 i + 1 开始考虑，直接从 j + 1 开始考虑即可。
//
//还有一种情况，就是因为到达末尾的时候，会回到 0。

            if (j<i)
                return -1;
            i=j;
        }
        return -1;
    }
}
